package com.cjm.algorithm.leetcode;

import java.util.Arrays;

public class MinSubArrayLen209 {
    public static int minSubArrayLen2(int target, int[] nums) {
        // 含有n个正数
        // target整数
        // 找出该数组满足其和>=target， 的长度最小
        // 连续子数组
        // 返回长度， 如果长度
        return 0;
    }
    public static int minSubArrayLen1(int target, int[] nums) {
        // 首先两个指针， 一个左， 一个右
        int l = 0, r = -1;
        // 和为0
        int sum = 0;
        // 长度为nums.length + 1, 这是一个不会达到的值， 如果没有变动， 那么就是没有这个子数组，
        // 也就是这个长度也可以为len = Integer.MAX_VALUE;
        int len = nums.length + 1;
        // 当左侧一直小于数组的长度时
        while (l < nums.length) {
            // 如果r+1小于数组的长度， 并且小于target的话， 那么就是数值不够， 还要往上加呢
            // 右侧指针往右移动
            if (r + 1 < nums.length && sum < target) {
                sum += nums[++r];
            } else {
                // 否则把左侧的数据给删除了， 并且， 左指针往右移动
                sum -= nums[l++];
            }
            // 如果数据还是大于；target的， 那么判断一下， 这个长度与之前的长度， 那一个小
            if (sum >= target) {
                len = Math.min(len, r - l + 1);
            }
        }
        if (len == nums.length + 1) {
            return 0;
        }
        return len;
    }
    public static int minSubArrayLen(int target, int[] nums) {
        int num = 0;
        int result = 0;
        int i = 0;
        int k = 0;
        while (i <= k && k <nums.length) {
            if (result >= target) {
                num = Math.min(k - i, num);
                i ++;
                result = result - nums[i - 1];
                num --;
                continue;
            }
            if (result < target) {
                if (k + 1 < nums.length) {
                    result = result + nums[k];
                    k++;
                    num ++;
                } else {
                    k++;
                }
            }
        }
        return num;
    }

    public static void main(String[] args) {
        System.err.println(minSubArrayLen1(7, new int[] {2,3,1,2,4,3}));
    }
}
